package com.heihei.utils;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 *  文件相关工具类
 *
 * @author duanhengfei
 * 2021年12月28日 23:44:55
 */
public class FileUtilsF {
    /** 常见图片文件后缀 */
    private final static List<String> IMG_SUFIX_LIST = Arrays.asList("jpg", "jpeg", "bmp", "png", "tif", "gif", "webp", "jfif");

    /** 常见视频文件后缀 */
    private final static List<String> VIDEO_SUFIX_LIST = Arrays.asList("avi", "mov", "ts", "rmvb", "rm", "flv", "mp4", "3gp", "mpeg", "asf", "wmv", "navi", "mkv", "f4v");



    /**
     * 根据当前文件，和跟目录，获取相对路径
     *
     * @author duanhengfei
     * 2021年12月28日 23:39:30
     */
    public static String getRelativePath(File file, File rootFile) {
        String allPathStr = file.getAbsolutePath();
        String relativePath = allPathStr.substring(rootFile.getAbsolutePath().length());
        return relativePath;
    }

    /**
     * 获取文件后缀名
     *
     * @author duanhengfei
     * 2021年12月28日 23:46:09
     */
    public static String getSufixOfFile(File file) {
        String name = file.getName();
        if(!name.contains(".")) {
            return null;
        }
        return name.substring(name.lastIndexOf(".") + 1);
    }

    /**
     * 获取文件后缀名（重载）
     */
    public static String getSufixOfFile(String fileAbsPathStr) {
        return getSufixOfFile(new File(fileAbsPathStr));
    }

    /**
     * 判断文件是否是视频
     *
     * @author duanhengfei
     * 2021年12月28日 23:57:00
     */
    public static boolean isVideo(File file) {
        return judgeFileType(file, 2);
    }

    /**
     * 判断文件是否是视频（根据文件全路径）
     */
    public static boolean isVideo(String fileAbsPathStr) {
        return isVideo(fileAbsPathStr, 1);
    }

    /**
     * 根据后缀名或者文件全路径，判断文件是否为视频
     * @param str  flag如果为1，表示str是文件全路径；  flag如果为2，表示str是文件后缀名
     *
     * @author duanhengfei
     * 2021年12月29日 00:12:15
     */
    public static boolean isVideo(String str, Integer flag) {
        if(flag == 1) {
            return isVideo(new File(str));
        } else if(flag == 2) {
            return judgeFileType(str, 2);
        }
        return false;
    }


    /**
     * 判别文件是否是图片
     *
     * @author duanhengfei
     * 2021年12月29日 00:05:38
     */
    public static boolean isImg(File file) {
        return judgeFileType(file, 1);
    }

    /**
     * 判断文件是否是视频（根据文件全路径）
     */
    public static boolean isImg(String fileAbsPathStr) {
        return isImg(fileAbsPathStr, 1);
    }

    /**
     * 根据后缀名或者文件全路径，判断文件是否为图片
     * @param str  flag如果为1，表示str是文件全路径；  flag如果为2，表示str是文件后缀名
     *
     * @author duanhengfei
     * 2021年12月29日 00:12:15
     */
    public static boolean isImg(String str, Integer flag) {
        if(flag == 1) {
            return isImg(new File(str));
        } else if(flag == 2) {
            return judgeFileType(str, 1);
        }
        return false;
    }


    /**
     * 判断文件类型（根据File对象）
     * @param flag 1表示判别图片， 2 表示判别视频
     *
     * @author duanhengfei
     * 2021年12月29日 00:01:15
     */
    private static boolean judgeFileType(File file, Integer flag) {
        if(file.isDirectory()) {
            return false;
        }
        String sufix = getSufixOfFile(file);
        return judgeFileType(sufix, flag);
    }

    /**
     * 判断文件类型（根据文件后缀名）
     * @param sufix 文件后缀
     * @param flag 1表示判别图片， 2 表示判别视频
     *
     * @author duanhengfei
     * 2021年12月29日 00:07:26
     */
    private static boolean judgeFileType(String sufix, Integer flag) {
        if(StringUtils.isEmpty(sufix)) {
            return false;
        }
        List<String> judgeList = null;
        if(1 == flag) {
            judgeList = IMG_SUFIX_LIST;
        } else if(2 == flag) {
            judgeList = VIDEO_SUFIX_LIST;
        }
        if(CollectionUtils.isEmpty(judgeList)) {
            return false;
        }
        if(judgeList.contains(sufix.toLowerCase())) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        System.out.println(isVideo(new File("C://123.mp4")));
    }
}
